package br.senai.mb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import br.senai.entidade.Cliente;
import br.senai.entidade.ClienteContato;
import br.senai.entidade.Endereco;
import br.senai.entidade.Sessao;
import br.senai.modelo.ClienteDAO;
import br.senai.modelo.impl.ClienteDAOImpl;
import br.senai.util.Validator;

@ManagedBean(name = "clienteMB")
@ViewScoped
public class ClienteMB extends ManagedBeanBase implements Serializable {
	
	private static final long serialVersionUID = 1L;

	private Cliente cliente;
	private ClienteContato contato;
	private List<Cliente> clientes;
	
	public ClienteMB() {
		listar();
	}

	private void listar() {
		ClienteDAO clienteDAO = (ClienteDAO) createPersistence(ClienteDAOImpl.class);
		clientes = clienteDAO.getLista();
	}

	public void salvar(ActionEvent event) {
		
		if (validarDados()) {
			ClienteDAO clienteDAO = (ClienteDAO) createPersistence(ClienteDAOImpl.class);
			cliente.setUsuario(((Sessao) super.getSessionAttribute("sessaoKey")).getUsuario());
			clienteDAO.salvar(cliente);
			listar();
			execute("modalForm.hide();");
		}
	}

	private boolean validarDados() {

		if (cliente.getNome() == null || cliente.getNome().isEmpty()) {
			addErrorMessage("Preencha o campo Nome", "");
			return false;
		} 
		
		else if (cliente.getRazaoSocial() == null || cliente.getRazaoSocial().isEmpty()) {
			addErrorMessage("Preencha o campo Razão Social", "");
			return false;
		}

		else if (cliente.getCnpj() == null || cliente.getCnpj().isEmpty()) {
			addErrorMessage("Preencha o campo CNPJ", "");
			return false;
		} else if (cliente.getCnpj() != null && !Validator.cnpjValidate(cliente.getCnpj())) {
			addErrorMessage("O CNPJ informado é inválido", "");
			return false;
		} else if (cliente.getCnpj() != null) {
			
			ClienteDAO clienteDAO = (ClienteDAO) createPersistence(ClienteDAOImpl.class);			
			Cliente clienteValidade = clienteDAO.buscarClientePorCnpj(cliente.getCnpj());
			
			if (clienteValidade != null && !clienteValidade.getId().equals(cliente.getId())) {
				addErrorMessage("Já existe um cliente cadastrado com esse CNPJ", "");
				return false;
			}
		}	
		
		return true;
	}

	public void excluir(ActionEvent event) {
		ClienteDAO clienteDAO = (ClienteDAO) createPersistence(ClienteDAOImpl.class);
		clienteDAO.remover(Cliente.class, cliente.getId());
	}
	
	public void novoCliente(ActionEvent event) {
		cliente = new Cliente();
		cliente.setEndereco(new Endereco());
		cliente.setClienteContatoLista(new ArrayList<ClienteContato>());
	}
	
	public void novoContato(ActionEvent event) {
		contato = new ClienteContato();
		contato.setCliente(cliente);
	}

	public void adicionarContato(ActionEvent event) {
		// Se for uma edição, não precisa adicionar na lista novamente
		if (contato.getId() == null) {
			cliente.getClienteContatoLista().add(contato);
		}
		
		// Fecha o dialog de cadastro de contato
		execute("modalFormContato.hide()");
	}

	public void excluirContato() {
		cliente.getClienteContatoLista().remove(contato);
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public ClienteContato getContato() {
		return contato;
	}

	public void setContato(ClienteContato contato) {
		this.contato = contato;
	}

}